package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.util.Date;

import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;

import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.controlador.backingBean.BKBanco;
import pe.com.cotelasa.scp.controlador.comando.ComandoActualizar;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.controlador.comando.ComandoVer;
import pe.com.cotelasa.scp.controlador.comando.IComando;
import pe.com.cotelasa.scp.dominio.service.IServicioBanco;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.entidad.Banco;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

@Named(value = "MBBanco")
@Scope("request")
public class MBBanco extends MBGenerico implements IMantenedor, Serializable {

    private static final long serialVersionUID = -3008828663507135744L;
    private static Logger logger = Logger.getLogger(MBBanco.class);
    @Inject
    private BKBanco bkBanco;
    @Autowired
    BKSession session;
    @Inject
    private IServicioBanco servicioBanco;
    
    private String URL;

    public MBBanco() {
    }

    public void buscarListaBancos() {
        Banco objBanco = new Banco();
        System.out.println("entro a buscar banco");
        objBanco.setNombre(bkBanco.getBancoBusqueda().getNombre() == null?"":bkBanco.getBancoBusqueda().getNombre());
        try {
            bkBanco.setListaBancosActivos(this.servicioBanco.listarBancosPorFiltro(objBanco));
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public String nuevo() {
        this.bkBanco.setComando(new ComandoGuardar(this));
        bkBanco.setBancoFormulario(new Banco());
        bkBanco.setBancoBusqueda(new Banco());
        return URLPaginacion.Banco.URL_FORMULARIO_BANCO;
    }

    public String editar() {
        this.bkBanco.setComando(new ComandoActualizar(this));
        bkBanco.setBancoBusqueda(new Banco());
        bkBanco.setBancoModificar(bkBanco.getBancoFormulario().getNombre());
        return URLPaginacion.Banco.URL_FORMULARIO_BANCO;
    }

    public String ver() {
        //comando = new ComandoVer(this);
        bkBanco.setBancoBusqueda(new Banco());
        return URLPaginacion.Banco.URL_VER_BANCO;
    }

    public String guardar() {
        Banco banco = bkBanco.getBancoFormulario();
        banco.setUsrCreacion(session.getUsuario().getUsuario());
        banco.setFecCreacion(new Date());
        try {
            if (servicioBanco.validarBanco(banco)) {
                servicioBanco.guardarBanco(banco);
                mostrarMensaje("Se guardo el banco satisfactoriamente.");
                buscarListaBancos();
                URL = URLPaginacion.Banco.URL_LISTA_BANCO;
            } else {
                mostrarError("Ya existe un banco con este nombre");
                URL = URLPaginacion.Banco.URL_FORMULARIO_BANCO;
            }

        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            URL = URLPaginacion.Banco.URL_FORMULARIO_BANCO;
        }
        return URL;
    }

    public String actualizar() {
        Banco banco = bkBanco.getBancoFormulario();
        banco.setUsrModificacion(session.getUsuario().getUsuario());
        banco.setFecModificacion(new Date());
        try {
            boolean band = true;
            if (!bkBanco.getBancoModificar().equals(bkBanco.getBancoFormulario().getNombre())) {
                band = servicioBanco.validarBanco(banco);
            }

            if (band) {
                servicioBanco.actualizarBanco(banco);
                mostrarMensaje("Se actualizo los datos del Banco satisfactoriamente.");
                buscarListaBancos();
                URL = URLPaginacion.Banco.URL_LISTA_BANCO;
            } else {
                mostrarError("Ya existe un Banco con este nombre");
                URL = URLPaginacion.Banco.URL_FORMULARIO_BANCO;
            }
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            URL = URLPaginacion.Banco.URL_FORMULARIO_BANCO;
        }
        
        return URL;
    }

    public String mostrarMantenimiento() {
        bkBanco.setBancoBusqueda(new Banco());
        bkBanco.setListaBancosActivos(null);
        return URLPaginacion.Banco.URL_LISTA_BANCO;
    }

    public void eliminar(ActionEvent actionEvent) {
        Banco banco = bkBanco.getBancoSeleccionado();
        banco.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
        banco.setUsrModificacion(session.getUsuario().getUsuario());
        banco.setFecModificacion(new Date());
        try {
            servicioBanco.actualizarBanco(banco);
            bkBanco.setListaBancosActivos(servicioBanco.listarBancosPorFiltro(bkBanco.getBancoBusqueda()));
            mostrarMensaje("Se elimino el banco satisfactoriamente");
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al eliminar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public String aceptar() {
        try {
            servicioBanco.actualizarBanco(bkBanco.getBancoFormulario());
            bkBanco.setBancoFormulario(servicioBanco.conseguirBancoPorId(1));
            bkBanco.setListaBancosActivos(servicioBanco.listarBancosActivos());
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.Banco.URL_LISTA_BANCO;
    }

    @Override
    public String retroceder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String cancelar() {
        return URLPaginacion.Banco.URL_LISTA_BANCO;
        //return mostrarMantenimiento();
    }
}
